草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - 如何删除 STL 容器?

STL中的容器对象(如vector)如何在堆中创建时被销毁?编辑如果容器持有指针,那么如何销毁那些指针对象 最佳答案 指针的STL容器不会清除指向的数据。它只会清理存放指针的空间。如果你想让vector清理指针数据,你需要使用某种智能指针实现:{std::vectorv1;v1.push_back(newSomeClass());std::vector>v2;boost::shared_ptrobj(newSomeClass);v2.push_back(obj);}当该作用域结束时,两个vector都将释放它们的内部数组。v1将泄漏

c++ - 构造函数中的 RAII 和异常

想象一下,我有一份工作要做,可以通过三种不同的方式完成:缓慢而痛苦,但故障安全的方式;给定你有Resource1的中度痛苦方式;一种快速简便的方法,需要Resource1和Resource2。现在,这些资源很宝贵,所以我将它们包装到RAII实现ResNHolder中并编写如下内容:voidDoTheJob(Logger&log/*,someotherparams*/){try{Res1Holderr1(/*argumentsforcreatingresource#1*/);try{Res2Holderr2(/*arguments*/);DoTheJobQuicklyAndEasily(

c++ - 在 Xcode 中检查 STL 容器

通过谷歌搜索,看起来Xcode(在我的例子中是3.1)至少应该尝试给我一个STL容器的合理调试View——或者至少是vector。但是,每当我在调试器中查看vector时,我只会看到M_impl,以及M_start和M_finish成员(以及其他几个成员)——但中间什么也没有!(这是一个调试版本,顺便说一句)。我是否遗漏了某个设置或某处?我还读到有可用的宏可以进一步增强调试查看器以检查更复杂的容器-但一直无法找到任何宏。我还希望能够查看std::wstrings,而不必转到内存查看器。它显示std::string很好。我可以做些什么来显示std::wstring吗?我意识到这是一个有点

c++ - 在 Enterprise Architect 中使用 C++ STL

如何在EnterpriseArchitect中使用部分C++STL?能够将某些类属性指定为std::string或使用std::auto_ptr(甚至std::tr1::shared_ptr)作为类型。另一件有趣的事情是如何将std::vector和std::map等容器类型集成到EA中。 最佳答案 我已经讲过STL容器在EA中的样子,我想它也可以扩展到STL指针:正向工程:您可以在语言设置中为全局的不同多样性定义集合类,或者为项目的特定类定义集合类(这将定义它如何“包含”在其他类中)thisway.简单示例设置:确保为关联的目标类

c++ - boost asio 套接字是否有适当的 RAII 清理

我尝试查看源代码,但无法浏览那么多模板代码。基本上:这是文档所说的(对于close()):RemarksForportablebehaviourwithrespecttogracefulclosureofaconnectedsocket,callshutdown()beforeclosingthesocket.我可以手动完成,但如果可能的话,依靠RAII会更好。因此,如果套接字超出范围,我是否需要对其调用shutdown()和close(),或者它会自动完成? 最佳答案 可以依靠套接字使用RAII执行适当的清理。当一个IO对象,比如

c++ - 创建 STL 映射键迭代器

通常,您有一个类似map的map其中键是映射值的名称,并且您需要一个API让消费者看到所有名称......例如填充GUI列表框。您可以构建一个vector并将其作为API调用返回,但这样效率很低。您可以只返回对map的引用,但随后也可以访问这些值,而您可能不希望这样。那么您如何编写一个兼容的类KeyIterator,它包装映射并提供对该映射中的键的标准迭代器访问。例如:mapm=...KeyIteratorki(m);for(KeyIterator::iteratorit=ki.begin();it!=ki.end();++it)coutKeyIterator应该是轻量级的,这样您就可

c++ - 接受 STL_container_type<string>::iterator 的模板化参数

我有一个函数,其中有一个包含字符串的容器(例如vector、set、list),并且给定一个开始迭代器和一个结束迭代器,通过迭代器范围处理字符串。目前函数声明如下:templatevoidProcessStrings(ContainerIterbegin,ContainerIterend);现在这将接受任何符合实现operator*的隐式接口(interface)的类型,前缀operator++以及函数体中的任何其他调用。我真正想做的是像下面这样明确限制输入量的定义(伪代码警告):template::iterator>voidProcessStrings(Container::iter

c++ - C++ 库中静态 STL 容器的双重初始化

这里有一些关于“静态初始化顺序失败”的很好的问题和答案,但我似乎遇到了它的另一种表达方式,特别难看,因为它不会崩溃,但会丢失和泄漏数据。我有一个自定义C++库和一个链接到它的应用程序。库中有一个静态的STL容器,用于注册一个类的所有实例。这些实例恰好是应用程序中的静态变量。作为“惨败”的结果(我相信),我们在应用程序初始化期间让容器充满了应用程序实例,然后库开始初始化并且容器被重置(可能是内存泄漏),最后只有库中的实例。这是我用简化代码重现它的方式:mylib.hpp:#include#include#includeusingnamespacestd;classMyLibClass{s

c++ - RAII、unique_ptr 和输出参数

我是一名尝试学习C++11的C#开发人员。我正在尝试使用windns.h查询DNS。我从DnsQuery()开始,读到我需要使用DnsRecordListFree()释放结果记录输出参数。C#方法可能是使用try-finallyblock来确保我无论如何都释放资源。但我了解到没有finallyblock,并且windns.h确实应该与时俱进并实现RAII兼容接口(interface)(据我了解典型的建议)。我没有等待它发生,而是尝试制作一个RAII包装器类,其析构函数调用DnsRecordListFree()并使用运算符重载转换来获取原始指针。但我对如何正确使用此句柄或指针来获取输出参

c++ - 如何将 C API 封装到 RAII C++ 类中?

给定一个库控制session的CAPI,将CAPI封装到RAIIC++类中的最佳设计是什么?CAPI看起来像:HANDLEOpenSession(STRINGsessionID);voidCloseSession(HANDLEhSession);HANDLEOpenItem(HANDLEhSession,STRINGitemID);voidCloseItem(HANDLEhItem);加上对其中一种类型(Session或Item)有用的其他函数,并直接映射到相关对象的C++成员函数。但这里不需要它们。我的主要兴趣是构建和销毁这些对象,使用RAII来管理这些类的正确打开和关闭。我设计类(